home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swags_z.zip / SCREEN.SWG / 0018_Three FAST write Routines.pas < prev    next >
Pascal/Delphi Source File  |  1993-06-08  |  3KB  |  73 lines

  1.  
  2. { THREE DIFFERENT WAYS TO WRITE TO SCREEN WITH ROW AND COLUMN }
  3. { TWO ARE VERY FAST AND ALLOW COLOR }
  4.  
  5. procedure QWrite( Column, Line , Color : byte; S : STRING );
  6.  
  7. var
  8.    VMode  : BYTE ABSOLUTE $0040 : $0049; { Video mode: Mono=7, Color=0-3 }
  9.    NumCol : WORD ABSOLUTE $0040 : $004A; { Number of CRT columns (1-based) }
  10.    VSeg   : WORD;
  11.    OfsPos : integer;  { offset position of the character in video RAM }
  12.    vPos   : integer;
  13.    sLen   : Byte ABSOLUTE S;
  14.  
  15. Begin
  16.   If VMode in [0,2,7] THEN VSeg := $B000 ELSE VSeg := $B800;
  17.   OfsPos   := (((pred(Line) * NumCol) + pred(Column)) * 2);
  18.   FOR vPos := 0 to pred(sLen) do
  19.       MemW[VSeg : (OfsPos + (vPos * 2))] :=
  20.                      (Color shl 8) + byte(S[succ(vPos)])
  21. End;
  22.  
  23.  
  24. procedure fastwrite(x, y, f, b: byte; s : STRING);
  25.  
  26. { Does a direct video write -- extremely fast.
  27.   X, Y = screen location of first byte;
  28.   S = string to display;
  29.   F = foreground color;
  30.   B = background color. }
  31.  
  32. type  videolocation = record    { the layout of a two-byte video location }
  33.         videodata: char;        { character displayed }
  34.         videoattribute: byte;   { attributes }
  35.         end;
  36.  
  37. var cnter: byte;
  38.     videosegment: word;         { the location of video memory }
  39.     monosystem: boolean;        { mono vs. color }
  40.     vidptr: ^videolocation;     { pointer to video locations }
  41.  
  42. begin
  43.  
  44. { Find the memory location where the string will be displayed at, according to
  45.   the monitor type and screen location.  Then associate the pointer VIDPTR with
  46.   that memory location: VIDPTR is a pointer to type VIDEOLOCATION.  Insert a
  47.   character and attribute; now go to the next character and video location. }
  48.  
  49.   monosystem := (lastmode in [0,2,7]);
  50.   if monosystem then videosegment := $b000 else videosegment := $b800;
  51.   vidptr := ptr(videosegment, 2*(80*(y - 1) + (x - 1)));
  52.   for cnter := 1 to length(s) do begin
  53.     vidptr^.videoattribute := (b shl 4) + f;  { high nibble=bg; lo nibble=fg }
  54.     vidptr^.videodata := s[cnter];            { put character at location }
  55.     inc(vidptr);                              { go to next video location }
  56.     end;
  57.   end;
  58.  
  59.  
  60. Procedure Print(x,y : Byte; S : String);
  61. BEGIN
  62.   ASM
  63.   MOV DH, Y    { DH = Row (Y) }
  64.   MOV DL, X    { DL = Column (X) }
  65.   DEC DH       { Adjust For Zero-based Bios routines }
  66.   DEC DL       { Turbo Crt.GotoXY is 1-based }
  67.   MOV BH,0     { Display page 0 }
  68.   MOV AH,2     { Call For SET CURSOR POSITION }
  69.   INT 10h
  70.   END;
  71. WRITE(S);
  72. END;
  73.